package com.ruike.alisurface.serialport;


import com.ruike.alisurface.serialport.serial.SerialPortInstructUtils;
import com.ruike.alisurface.utils.ShareKey;
import com.voodoo.lib_logcat.L;
import com.voodoo.serialport.SerialPortTtys3Util;
import com.voodoo.serialport.callback.SerialCallBack;

import org.greenrobot.eventbus.EventBus;

import static com.ruike.alisurface.utils.ShareKey.Type_toGoshopzl;

/**
 * 串口3 的底层通信类
 */
public class Ttys3Utils implements SerialCallBack {

    private static Ttys3Utils ttys3Utils;
    private boolean isSerialPortOpen = false; // 串口是否打开

    public static Ttys3Utils getInstance() {
        if (ttys3Utils == null) {
            synchronized (Ttys3Utils.class) {
                if (ttys3Utils == null) {
                    ttys3Utils = new Ttys3Utils();
                }
            }
        }
        return ttys3Utils;
    }

    /**
     * 打开串口
     */
    public void openPort() {
        SerialPortTtys3Util.open();
    }

    /**
     * 检查串口是否已经打开
     *
     * @return true：打开成功  false：未打开或者打开失败
     */
    public boolean isSerialPortOpen() {
        return isSerialPortOpen;
    }

    /**
     * 发送十六进制的字符串
     */
    public void sendHexData(String strmsg) {
        SerialPortTtys3Util.sendHex(strmsg);
    }

    /**
     * 发送十六进制的字符串
     */
    public void sendBytesData(byte[] bytes) {
        SerialPortTtys3Util.sendBytes(bytes);
    }


    /**
     * @param isOpenSuccess 是否打开成功
     * @param portName      串口地址名称
     * @param msg           回传的消息
     */
    @Override
    public void onSerialPortOpenListener(boolean isOpenSuccess, String portName, String msg) {
        isSerialPortOpen = isOpenSuccess;
    }

    /**
     * 串口数据
     *
     * @param serialPortData 发送数据的String格式 "01 02 03 04 "
     * @param resultBytes    发送数据的byte数组格式
     */
    @Override
    public void onSerialPortData(String serialPortData, byte[] resultBytes) {
        if (serialPortData.isEmpty()) {
            L.i("串口3： 返回值：数据异常");
            return;
        }
        if (resultBytes.length < 4) {
            L.i("串口3： 返回长度太短：" + serialPortData);
            return;
        }
        L.i("串口3： 返回值：" + serialPortData);
        if (onSerialPortResultDataListener != null) {
            onSerialPortResultDataListener.onDataReceived(serialPortData, resultBytes);
        }

        String data = serialPortData.replaceAll(" ", "");
        if (data.equals("10020618")) {
            EventBus.getDefault().post(new MsgEventBus(Type_toGoshopzl, serialPortData));
        }
        if (resultBytes[2] == (byte) 0x21) {
            EventBus.getDefault().post(new MsgEventBus("每层的设置返回", serialPortData));

        }
        if (resultBytes[2] == (byte) 0x23) {
            EventBus.getDefault().post(new MsgEventBus("保存所有的设置返回", serialPortData));

        }
    }

    public OnSerialPortResultDataListener onSerialPortResultDataListener;

    public void setOnSerialPortResultDataListener(OnSerialPortResultDataListener onSerialPortResultDataListener) {
        this.onSerialPortResultDataListener = onSerialPortResultDataListener;
    }


    public interface OnSerialPortResultDataListener {
        void onDataReceived(String resultDataStr, byte[] resultBytes);
    }

    // =============================================================================================

    /**
     * 发送灯光指令
     *
     * @param ledMode 灯光模式 0：开关模式  1：呼吸模式
     * @param ledNum  灯光通道 0 1 2 ...
     * @param isOpen  对应通道号LED开关状态（只在开关模式下有效）：{@link true}-开，{@link false}-关
     * @param ledMax  呼吸灯最大亮度（只在呼吸模式下有效）：取值1-30
     * @param ledTime 呼吸灯呼吸时间（只在呼吸模式下有效）：取值1-30
     * @return 拼接好的串口数据
     */
    public void ledOpenOrClose(int ledMode, int ledNum, boolean isOpen, int ledMax, int ledTime) {
        sendHexData(SerialPortInstructUtils.ledLight(10, ledMode, ledNum, isOpen, ledMax, ledTime));
    }

    public void ledOpenOrClose(int address, int ledMode, int ledNum, boolean isOpen, int ledMax, int ledTime) {
        sendHexData(SerialPortInstructUtils.ledLight(address, ledMode, ledNum, isOpen, ledMax, ledTime));
    }

    /**
     * 出货货道转动
     *
     * @param index      货道号
     * @param indexType  货道类型 0-弹簧货道，1-电磁锁货道，2-履带
     * @param turnNumber 转动次数
     * @return
     */
    public void outGoods(int index, int indexType, int turnNumber) {
        sendHexData(SerialPortInstructUtils.quDongOutGoods(index, indexType, turnNumber));
    }

    /**
     * 查询驱动板程序编号和板子批次
     *
     * @param cabinet 主副柜
     */
    public void getQuDongVersion(int cabinet) {
        sendHexData(SerialPortInstructUtils.checkQuDongVersion(cabinet));
    }

    /**
     * 查询温控板程序编号和板子批次或者及  温控值  继电器及运行类型
     *
     * @param cabinet
     */
    public void getWenKongVersion(int cabinet) {
        sendHexData(SerialPortInstructUtils.checkWenKongVersion(cabinet));
    }

    /**
     * 门电控锁
     * ElecEn：电磁锁使能标志，0-关闭此功能，1-开启此功能，在0的状态下，所有设置无效。
     * ElecNum：需要打开哪个电磁锁，0表示1通道，1表示2通道
     * ElecOnTi：电磁锁通电时间，取值3-50，对应0.3s-5s
     * ElecState：对应通道电磁锁的状态，0表示没有通电，1表示已通电。
     * boxno:货柜编号 0是主柜 其余递推
     *
     * @param boxno
     */
    public void DoorSetting(int boxno, int ElecOnTi, int ElecNum) {
        sendHexData(SerialPortInstructUtils.quDongOpenElectricDoor(boxno, ElecOnTi, ElecNum));
    }

    /**
     * 是否开启加湿器
     *
     * @param isHumidifier
     */
    public void isHumidifier(boolean isHumidifier) {
        sendHexData(SerialPortInstructUtils.UV_lamp_start_and_stop(isHumidifier));
    }

    /**
     * 解析温控度    继电器  及  运行类型
     *
     * @param date
     */
    public void getJudgeiswk(String date) {

        String[] temp = date.split(" ");
        String head = temp[0];
        if (head.equals("23")) {
            EventBus.getDefault().post(new MsgEventBus("温控返回", date));
            L.i("温控板指令  =" + date);
            String type = temp[2];
            L.i("type=" + type);

            if (type.equals("01")) { //温湿度

                EventBus.getDefault().post(new MsgEventBus(ShareKey.Type_Temperature, "serialPortData"));
            } else if (type.equals("02")) {//继电器

            } else if (type.equals("03")) {//运行类型

            }
        }
        return;
    }
}
